%Funcion que agrega ruido al nr% de los pixeles de la imagen. Nos aseguramos de que SI O SI cambie el valor de esos pixeles.
%Esta version de "agRuido" es la que mas me convence

function [T,x,y] = agRuido4(n,nr,img) %nr = nivel de ruido (es el porcentaje de ruido que queremos tener; va de 0 a 100)

%copio la imagen, solo voy a modificar el nr% de los pixeles
for i=1:n
	for j=1:n
		T(i,j) = img(i,j);
	end
end

%seleccionamos el nr% de los pixeles (sus coordenadas) de la imagen 
cant = (nr * n^2) / 100;

indexPosPix = zeros(1,cant); %indices (sin repetidos) de los pixeles a modificar de la matriz "img"; por ej [5,3,1,9,8...]; x ej n=3, entonces 5 es img(2,2).
ran = randperm(n^2); %devuelve un vector permutando los numeros 1 a n^2
indexPosPix = ran(1:cant); %selecciona solo cant numeros DISTINTOS de la lista "ran" 

%ahora agregamos el ruido:
for k = 1:cant
	r = (nr*255/100) + rand(1,1)*((100-nr)*255/100); %numero al azar entre el nr% de 255 y 255 (asi nos aseguramos de que r!=0 SIEMPRE, obviamente si nr!=0)
	f = idivide(indexPosPix(k),n,"ceil");
	if mod(indexPosPix(k),n)==0
		c = n;
	else
		c = mod(indexPosPix(k),n);
	end
	p = double(img(f,c)); %VALOR del pixel a modificar
	izq = p-r;
	der = p+r;
	if (izq<0 && der>255) %[p-r;p+r] contiene al [0,255]
		if (255-p < p)
			T(f,c) = 0;
		else
			T(f,c) = 255;
		end
	elseif (izq<0) %solo se pasa del 0
		T(f,c) = p+r;
	elseif (der>255) %solo se pasa del 255
		T(f,c) = p-r;
	else %[p-r;p+r] esta totalmente contenido en el [0,255], o sea da lo mismo si tomo (p+r) o (p-r)
		T(f,c) = p-r; %es lo mismo si tomo (p+r) o (p-r)
	end
end

T = uint8(T);
